package com.laboratory.ognl;

import com.laboratory.string.User;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Configurator;
import org.junit.Before;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @description:
 * @author: gaochao
 * @time: 2020/12/19 21:20
 * ognl  3.0.8
 * javassist 3.18.2-GA
 * mybatis使用的此版本。
 */
public class OgnlTest {

    private static Logger logger = LogManager.getLogger(OgnlTest.class);

    public static void main(String[] args) {

    }

    @Before
    public void setup() throws IOException {
        ConfigurationSource tConfigurationSource =
                new ConfigurationSource(new FileInputStream("src/main/java/com/laboratory/log4j/log4j.properties"));

        Configurator.initialize(null, tConfigurationSource);

    }

    //1.OGNL调用对象的方法
    @Test
    public void demo1() {
        try {
//            1.OGNL调用对象的方法
            //            创建context对象
            OgnlContext context = new OgnlContext();
            //            利用context来获取root对象
            Object root = context.getRoot();
            Object value = Ognl.getValue("'hello'.length()", context, root);
            logger.info("value--------" + value);

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }


    }

    //2.利用ognl访问类中的静态方法
    @Test
    public void demo2() {
        try {
            OgnlContext context = new OgnlContext();
            Object root = context.getRoot();
            Double value = (Double) Ognl.getValue("@java.lang.Math@random()", context, root); //这里注意获取静态方法表达式是固定表达： @类名@方法名
            logger.info("value----" + value);
        } catch (OgnlException e) {
            logger.error(e.getMessage(), e);
        }
    }

    // 3.获取root区中的数据
    @Test
    public void demo3() {
        OgnlContext context = new OgnlContext();
//        Object root = context.getRoot();
        //注意，这里不能在getValue方法外面初始化获取root对象，不然导致该root为null，传进方法里面，由于root在外面已经被定义，方法底层就不会帮助创建赋值，直接报异常，name值根本不会再存
//            向root区域存值,setRoot(Object obj),root就是通过一个对象找到与它关联的对象，所以只能用来存对象类型
        User user = new User();
        user.setUserName("zhangsan");
        context.setRoot(user);
//            root的取值不需要加上#，它是ognl内部的，所以不需要加#来特意告诉ognl
        String userName;
        try {
            userName = (String) Ognl.getValue("userName", context, context.getRoot());
            logger.info("userName------" + userName);
        } catch (OgnlException e) {
            e.printStackTrace();
        }
    }

    //4.获取context区域的值
   @Test
    public void demo4(){
       //            创建context对象
       OgnlContext context = new OgnlContext();
//            利用context来获取root对象
       Object root = context.getRoot();
//            向context区域存值,set一般向里面存对象，而context区域用put是存值
       context.put("name","张萨姆");
       String value;
       try {
//            root的取值不需要加上#，它是ognl内部的，所以不需要加#来特意告诉ognl，而context区域上该ognl的所处的上下文环境，外部，要加上#说明
           value = (String) Ognl.getValue("#name", context, root);
           System.out.println(value);
       } catch (OgnlException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }



   }



}
